#include <iostream>
#include <cstring>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include "comm.cpp"

using namespace std;

int main()
{
    key_t key = getkey();

    sleep(5);
    cout << "开始创建共享内存" << endl;
    // IPC_CREAT:如果key对应的共享内存存在则直接返回，`不存在则直接创建
    // IPC_EXCL:如果key对应的共享内存存在则报错，他的目的是确保共享内存是新创建出来的。
    // 0644 共享内存的权限
    int shmid = createshm(key, size);

    sleep(5);
    cout << "开始挂接共享内存" << endl;
    // 第二个参数 ：让挂接在进程地址空间的共享区的指定的地址
    // 第三个参数控制共内存的权限（但是这里创建的时候就已经带了权限，所以设置为0）
    char* s = (char*)shmat(shmid, nullptr, 0);

    sleep(5);
    cout << "即将与共享内存解除挂接" << endl;
    // 将进程与共享内存解除挂接
    int shmret = shmdt(s);

    sleep(5);
    cout << "开始释放共享内存" << endl;
    // 第二个参数用来对共享内存进操作
    // 第三个参数用来指向一个共享内存的结构体的一部分（子集），其中包含了一些共享内存的一些属性，供用户控制（修改）
    int desret = shmctl(shmid, IPC_RMID, nullptr);

    return 0;
}